package com.util.orm.dao;

import com.util.common.QueryList;
import com.util.common.QueryParam;

import java.io.Serializable;
import java.util.List;

/**
 * dao api
 * @param <E>
 * @param <PK>
 */
public interface Dao <E,PK extends Serializable>{

	/**
	 * 根据主键查询
	 * @param id
	 * @return
	 * @throws DataAccessException
	 */
	E getByPk(PK id) throws DataAccessException;

	/**
	 * 根据某个非主键查询单条记录
	 * @param param
	 * @return
	 * @throws DataAccessException
	 */
	E selectOne(Object param) throws DataAccessException;
	
	/**
	 * 根据某个非主键查询单条记录
	 * @param sqlId
	 * @param param
	 * @return
	 * @throws DataAccessException
	 */
	E selectOne(String sqlId, Object param) throws DataAccessException;
	
	/**
	 * 
	 * 查询总数
	 * @param param
	 * @return
	 */
	Long getCount(Object param);
	
	/**
	 * 查询总数
	 * @param sqlId
	 * @param param
	 * @return
	 */
	Long getCount(String sqlId, Object param);
	
	/**
	 * 根据主键删除
	 * @param id
	 * @return
	 * @throws DataAccessException
	 */
	int deleteByPk(PK id) throws DataAccessException;
	
	/**
	 * 根据对象删除
	 * @param entity
	 * @return
	 * @throws DataAccessException
	 */
	int delete(E entity) throws DataAccessException;
	
	/**
	 * 根据对象删除
	 * @param entity
	 * @return
	 * @throws DataAccessException
	 */
	int delete(String sqlId, E entity) throws DataAccessException;
	
	/**
	 * 插入数据
	 * @param entity
	 * @return
	 * @throws DataAccessException
	 */
	int insert(E entity) throws DataAccessException;
	
	/**
	 * 更新数据
	 * @param entity
	 * @return
	 * @throws DataAccessException
	 */
	int update(E entity) throws DataAccessException;
	
	/**
	 * 根据sqlId更新数据
	 * @param entity
	 * @return
	 * @throws DataAccessException
	 */
	int update(String sqlId, E entity) throws DataAccessException;

	/**
	 * 更新数据
	 * @param param
	 * @return
	 * @throws DataAccessException
	 */
	int updateByParam(String sqlId, Object param);
	
	/**
	 * 查询
	 * @param param
	 * @return
	 */
	List<E> selectList(Object param);
	
	/**
	 * 查询,指定sqlId
	 * @param sqlId
	 * @param param
	 * @return
	 */
	List<E> selectList(String sqlId, Object param);
	
	/**
	 * 分页查询, 指定可分页查询条件
	 * @param pageParam
	 * @return
	 */
	QueryList<E> selectPage(QueryParam pageParam);
	
	
	/**
	 * 分页查询, 指定特定sqlId语句，指定可分页查询条件
	 * @param sqlId
	 * @param pageParam
	 * @param otherParam
	 * @return
	 */
	QueryList<E> selectPage(String sqlId, QueryParam pageParam, Object otherParam);
	
	/**
	 * 启动批量模式
	 * @throws DataAccessException
	 */
	void startBatch()  throws DataAccessException;
	
	/**
	 * 释放暂存的批量更新操作，但不提交事务。
	 * 如果数据量特别大，中途可以多次执行此操作
	 * @return 
	 * @throws DataAccessException
	 */
	int flushBatch()  throws DataAccessException;
	/**
	 * 执行批量提交，但不提交事务，事务由容器提交。
	 * 最后一次提交批量操作。
	 * @throws DataAccessException
	 */
	void executeBatch()  throws DataAccessException;
	
	/**
	 * 取消批量操作，并回滚。
	 * @throws DataAccessException
	 */
	void cancelBatch()  throws DataAccessException;
	
	/**
	 * 执行批量提交， 最后一次提交批量操作。如果commitTx为true则提交事务。
	 * 此方法通常用户用户自己控制事务
	 * @param commitTx 提交事务
	 * @throws DataAccessException
	 */
	void executeBatch(boolean commitTx)  throws DataAccessException;
	
	/**
	 * 取消批量操作。如果commitTx为true则回滚事务。
	 * 此方法通常用户用户自己控制事务。
	 * @throws DataAccessException
	 */
	void cancelBatch(boolean commitTx)  throws DataAccessException;
}
